package br.com.centralit.lucene;
import java.io.File;
import java.io.IOException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopFieldCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.NumericUtils;
import org.apache.lucene.util.Version;
import br.com.centralit.citcorpore.bean.AnexoBaseConhecimentoDTO;
import br.com.centralit.citcorpore.bean.BaseConhecimentoDTO;
import br.com.centralit.citcorpore.bean.PalavraGemeaDTO;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.excecao.LogicException;
/**
* Trata todas as pesquisas por similaridade usando o Apache LUCENE como mecanismo de busca. N�s precisamos do Lucene porque ele ao contr�rio do banco de dados � capaz de retornar um resultado aproximado da pesquisa, mesmo quando o que foi pesquisado n�o existe no cadastro e ainda os classifica por similaridade e por outros campos que quisermos ordenar o resultado; existem outros fatores, mas dentre eles o mais importante, tamb�m, � ele possuir uma maior velocidade no retorno das pesquisas.
* vers�o da classe 1.0
*
* @author euler.ramos
*/
public class Lucene {
private String dirAnexos;
private String dirBaseConhecimento;
private String dirGemeas;
public Lucene() {
this.dirAnexos = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.LUCENE_DIR_ANEXOBASECONHECIMENTO, "/usr/local/arquivosLucene/AnexoBaseConhecimento");
this.dirBaseConhecimento = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.LUCENE_DIR_BASECONHECIMENTO, "/usr/local/arquivosLucene/BaseConhecimento");
this.dirGemeas = ParametroUtil.getValorParametroCitSmartHashMap(Enumerados.ParametroSistema.LUCENE_DIR_PALAVRAGEMEA, "/usr/local/arquivosLucene/PalavraGemea");
}
public String getDirAnexos() {
return dirAnexos;
}
public String getDirBaseConhecimento() {
return dirBaseConhecimento;
}
public String getDirGemeas() {
return dirGemeas;
}
private boolean indexarDocGemeo(PalavraGemeaDTO palGemeaDTO) throws IOException {
this.excluirPalavraGemea(palGemeaDTO);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(dirGemeas));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35,
analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, config);
Document doc = new Document();
doc.add(new Field("palavra", palGemeaDTO.getPalavra(), Store.YES, Index.ANALYZED));
doc.add(new Field("correspondente", palGemeaDTO.getPalavraCorrespondente(), Store.YES, Index.ANALYZED));
NumericField id = new NumericField("id", Store.YES, true);
id.setLongValue(palGemeaDTO.getIdPalavraGemea());
doc.add(id);
indexWriter.addDocument(doc);
indexWriter.close();
indexDir.close();
return true;
}
public boolean indexarListaPalavrasGemeas(Collection<PalavraGemeaDTO> palGemeas) {
try {
if (palGemeas != null && palGemeas.size() > 0) {
for (PalavraGemeaDTO palGemea : palGemeas) {
if (palGemea.getIdPalavraGemea() != null
&& palGemea.getPalavra() != null
&& palGemea.getPalavraCorrespondente() != null) {
indexarDocGemeo(palGemea);
}
}
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public boolean indexarPalavraGemea(PalavraGemeaDTO palavraGemeaDTO) {
try {
if (palavraGemeaDTO != null) {
if (palavraGemeaDTO.getIdPalavraGemea() != null
&& palavraGemeaDTO.getPalavra() != null
&& palavraGemeaDTO.getPalavraCorrespondente() != null){
indexarDocGemeo(palavraGemeaDTO);
}
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
private boolean indexarDocumentoAnexoBaseConhecimento(AnexoBaseConhecimentoDTO anexoBaseConhecimentoDTO) throws IOException {
this.excluirAnexoBaseConhecimento(anexoBaseConhecimentoDTO);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(dirAnexos));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, config);
Document doc = new Document();
if ((anexoBaseConhecimentoDTO.getDescricao()==null)||(anexoBaseConhecimentoDTO.getDescricao().length() <= 0)) {
doc.add(new Field("descricao", "vazio", Store.YES, Index.ANALYZED));
} else {
doc.add(new Field("descricao", anexoBaseConhecimentoDTO.getDescricao(), Store.YES, Index.ANALYZED));
}
if ((anexoBaseConhecimentoDTO.getNomeAnexo()==null)||(anexoBaseConhecimentoDTO.getNomeAnexo().length() <= 0)) {
doc.add(new Field("nome", "vazio", Store.YES, Index.ANALYZED));
} else {
doc.add(new Field("nome", anexoBaseConhecimentoDTO.getNomeAnexo(), Store.YES, Index.ANALYZED));
}
if ((anexoBaseConhecimentoDTO.getTextoDocumento()==null)||(anexoBaseConhecimentoDTO.getTextoDocumento().length() <= 0)) {
doc.add(new Field("texto", "vazio", Store.YES, Index.ANALYZED));
} else {
doc.add(new Field("texto", anexoBaseConhecimentoDTO.getTextoDocumento(), Store.YES, Index.ANALYZED));
}
NumericField idbaseconhecimento = new NumericField("idbaseconhecimento", Store.YES, true);
idbaseconhecimento.setLongValue(anexoBaseConhecimentoDTO.getIdBaseConhecimento());
doc.add(idbaseconhecimento);
NumericField id = new NumericField("id", Store.YES, true);
id.setLongValue(anexoBaseConhecimentoDTO.getIdAnexoBaseConhecimento());
doc.add(id);
indexWriter.addDocument(doc);
indexWriter.close();
indexDir.close();
return true;
}
private boolean indexarAnexoBaseConhecimento(List<AnexoBaseConhecimentoDTO> listaAnexoBaseConhecimento) {
try {
if (listaAnexoBaseConhecimento != null) {
for (AnexoBaseConhecimentoDTO anexoBaseConhecimentoDTO : listaAnexoBaseConhecimento) {
if (anexoBaseConhecimentoDTO.getDescricao() != null
&& anexoBaseConhecimentoDTO.getIdBaseConhecimento() != null
&& anexoBaseConhecimentoDTO
.getIdAnexoBaseConhecimento() != null) {
indexarDocumentoAnexoBaseConhecimento(anexoBaseConhecimentoDTO);
}
}
return true;
} else {
return false;
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
private boolean indexarDocumentoBaseConhecimento(BaseConhecimentoDTO baseConhecimentoDTO,boolean excluiAnexos) throws IOException {
this.excluirBaseConhecimento(baseConhecimentoDTO,excluiAnexos);
if (baseConhecimentoDTO.ativa()){
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(dirBaseConhecimento));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, config);
Document doc = new Document();
if ((baseConhecimentoDTO.getTitulo()==null)||(baseConhecimentoDTO.getTitulo().length() <= 0)) {
doc.add(new Field("titulo", "vazio", Store.YES, Index.ANALYZED));
} else {
doc.add(new Field("titulo", escape(baseConhecimentoDTO.getTitulo()),
Store.YES, Index.ANALYZED));
}
if ((baseConhecimentoDTO.getConteudoSemFormatacao()==null)||(baseConhecimentoDTO.getConteudoSemFormatacao().length() <= 0)) {
doc.add(new Field("conteudo", "vazio", Store.YES, Index.ANALYZED));
} else {
doc.add(new Field("conteudo", baseConhecimentoDTO.getConteudoSemFormatacao(), Store.YES, Index.ANALYZED));
}
NumericField idusuarioautor = new NumericField("idusuarioautor", Store.YES, true);
if (baseConhecimentoDTO.getIdUsuarioAutor() == null) {
idusuarioautor.setLongValue(0);
} else {
idusuarioautor.setLongValue(baseConhecimentoDTO.getIdUsuarioAutor());
}
doc.add(idusuarioautor);
NumericField idusuarioaprovador = new NumericField("idusuarioaprovador", Store.YES, true);
if (baseConhecimentoDTO.getIdUsuarioAprovador() == null) {
idusuarioaprovador.setLongValue(0);
} else {
idusuarioaprovador.setLongValue(baseConhecimentoDTO.getIdUsuarioAprovador());
}
doc.add(idusuarioaprovador);
NumericField datainicio = new NumericField("datainicio", Store.YES, true);
if (baseConhecimentoDTO.getDataInicio() == null) {
datainicio.setLongValue(0);
} else {
datainicio.setLongValue(baseConhecimentoDTO.getDataInicio().getTime());
}
doc.add(datainicio);
NumericField datapublicacao = new NumericField("datapublicacao", Store.YES, true);
if (baseConhecimentoDTO.getDataPublicacao() == null) {
datapublicacao.setLongValue(0);
} else {
datapublicacao.setLongValue(baseConhecimentoDTO.getDataPublicacao().getTime());
}
doc.add(datapublicacao);
NumericField dataexpiracao = new NumericField("dataexpiracao", Store.YES, true);
if (baseConhecimentoDTO.getDataExpiracao() == null) {
dataexpiracao.setLongValue(0);
} else {
dataexpiracao.setLongValue(baseConhecimentoDTO.getDataExpiracao().getTime());
}
doc.add(dataexpiracao);
if ((baseConhecimentoDTO.getMedia()==null)||(baseConhecimentoDTO.getMedia().length() <= 0)) {
doc.add(new Field("avaliacao", "vazio", Store.YES, Index.NOT_ANALYZED));
} else {
doc.add(new Field("avaliacao", baseConhecimentoDTO.getMedia(), Store.YES, Index.NOT_ANALYZED));
}
NumericField cliques = new NumericField("cliques", Store.YES, true);
if (baseConhecimentoDTO.getContadorCliques() == null) {
cliques.setLongValue(0);
} else {
cliques.setLongValue(baseConhecimentoDTO.getContadorCliques());
}
doc.add(cliques);
NumericField idpasta = new NumericField("idpasta", Store.YES, true);
if (baseConhecimentoDTO.getIdPasta() == null) {
idpasta.setLongValue(0);
} else {
idpasta.setLongValue(baseConhecimentoDTO.getIdPasta());
}
doc.add(idpasta);
if (baseConhecimentoDTO.getGerenciamentoDisponibilidade() == null || !baseConhecimentoDTO.getGerenciamentoDisponibilidade().equalsIgnoreCase("S")) {
doc.add(new Field("gerdisponibilidade", "N", Store.YES, Index.NOT_ANALYZED));
} else {
doc.add(new Field("gerdisponibilidade", "S", Store.YES, Index.NOT_ANALYZED));
}
NumericField id = new NumericField("id", Store.YES, true);
id.setLongValue(baseConhecimentoDTO.getIdBaseConhecimento());
doc.add(id);
indexWriter.addDocument(doc);
indexWriter.close();
indexDir.close();
return true;
} else {
return false;
}
}
public boolean indexarBaseConhecimento(BaseConhecimentoDTO baseConhecimentoDTO) {
try {
if (baseConhecimentoDTO != null && baseConhecimentoDTO.getIdBaseConhecimento() != null) {
indexarDocumentoBaseConhecimento(baseConhecimentoDTO,false);
return true;
} else {
return false;
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public boolean indexarBaseConhecimento(BaseConhecimentoDTO baseConhecimentoDTO,List<AnexoBaseConhecimentoDTO> listaAnexoBaseConhecimento) {
try {
if (baseConhecimentoDTO != null && baseConhecimentoDTO.getIdBaseConhecimento() != null) {
indexarDocumentoBaseConhecimento(baseConhecimentoDTO,true); //J� exclui a Base e seus anexos se ela n�o estiver ativa!
if (baseConhecimentoDTO.ativa()){
indexarAnexoBaseConhecimento(listaAnexoBaseConhecimento);
}
return true;
} else {
return false;
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/**
* Exclui documento da indexa��o
*
* @param diretorio
* @param indice
* @param campo
* @return
*/
private boolean excluiDoc(String diretorio, Long id) {
try {
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(diretorio));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35,
analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, config);
indexWriter.deleteDocuments(new Term("id", NumericUtils.longToPrefixCoded(id)));
indexWriter.close();
indexDir.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public boolean excluirPalavraGemea(PalavraGemeaDTO palGemea) {
if (palGemea != null && palGemea.getIdPalavraGemea() > 0) {
this.excluiDoc(dirGemeas, Long.parseLong(String.valueOf(palGemea.getIdPalavraGemea())));
}
return true;
}
//Exclui usando o ID do Anexo!!!!!
private boolean excluirAnexoBaseConhecimento(AnexoBaseConhecimentoDTO anexoBaseConhecimentoDTO){
if (anexoBaseConhecimentoDTO != null && anexoBaseConhecimentoDTO.getIdAnexoBaseConhecimento() > 0) {
this.excluiDoc(dirAnexos,Long.parseLong(String.valueOf(anexoBaseConhecimentoDTO.getIdAnexoBaseConhecimento())));
}
return true;
}
//Exclui usando o ID da base de Conhecimento!!!!!
public boolean excluiAnexosDaBaseConhecimento(Long id) {
try {
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(dirAnexos));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35,analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, config);
indexWriter.deleteDocuments(new Term("idbaseconhecimento", NumericUtils.longToPrefixCoded(id)));
indexWriter.close();
indexDir.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
//Exclui a Base de Conhecimento e todos os seus anexos!!!
public boolean excluirBaseConhecimento(BaseConhecimentoDTO baseConhecimentoDTO, boolean excluiAnexos) {
if (baseConhecimentoDTO != null && baseConhecimentoDTO.getIdBaseConhecimento() > 0) {
if (excluiAnexos) {
this.excluiAnexosDaBaseConhecimento(Long.parseLong(String.valueOf(baseConhecimentoDTO.getIdBaseConhecimento())));
}
this.excluiDoc(dirBaseConhecimento, Long.parseLong(String.valueOf(baseConhecimentoDTO.getIdBaseConhecimento())));
}
return true;
}
/* public boolean baseConhecimentoIndexada(Long id) {
boolean resultado = false;
try {
Directory indexDir = FSDirectory.open(new File(this.dirBaseConhecimento));
IndexSearcher isearcher = new IndexSearcher(indexDir);
TermQuery termQuery = new TermQuery(new Term("id", NumericUtils.longToPrefixCoded(id)));
ScoreDoc[] hits = isearcher.search(termQuery, null, 1).scoreDocs;
if (hits.length > 0) {
resultado = true;
}
isearcher.close();
indexDir.close();
return resultado;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
*/
private ArrayList<BaseConhecimentoDTO> pesquisaShould(String indice, ArrayList<String> gemeas, ArrayList<Long> anexos, String avaliacao, String gerDisp, long idAutor, long idAprovador, long dtInicioi, long dtIniciof, long dtPublicacaoi, long dtPublicacaof, long dtExpiracaoi, long dtExpiracaof, long idPasta) throws ParseException, LogicException {
try {
ArrayList<BaseConhecimentoDTO> resultado = new ArrayList<BaseConhecimentoDTO>();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(dirBaseConhecimento));
// Tratando para ver se existe arquivo de �ndice no diret�rio
// if (indexDir.listAll().length > 0) { N�o vou utilizar por quest�o
// de performance, trazer uma lista com todos os arquivos do
// diret�rio pode demorar!
IndexSearcher isearcher = new IndexSearcher(indexDir);
QueryParser parser;
Query query;
BooleanQuery booleanQuery = new BooleanQuery();
if (indice != null && !indice.isEmpty() && indice.length() > 2) {
// Pesquisa principal informada pelo usu�rio no campo titulo
parser = new QueryParser(Version.LUCENE_35, "titulo", analyzer);
query = parser.parse(indice);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
// Busca por refer�ncias �s palavras g�meas envolvidas no campo titulo
if (gemeas != null && gemeas.size() > 0) {
for (String palavra : gemeas) {
parser = new QueryParser(Version.LUCENE_35, "titulo", analyzer);
query = parser.parse(palavra);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
}
}
// Pesquisa principal informada pelo usu�rio no campo conteudo
parser = new QueryParser(Version.LUCENE_35, "conteudo", analyzer);
query = parser.parse(indice);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
// Busca por refer�ncias �s palavras g�meas envolvidas no campo conteudo
if (gemeas != null && gemeas.size() > 0) {
for (String palavra : gemeas) {
parser = new QueryParser(Version.LUCENE_35, "conteudo", analyzer);
query = parser.parse(palavra);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
}
}
}
// Busca Base de conhecimento que tem ANEXO se referindo ao conte�do da pesquisa
if (anexos != null && anexos.size() > 0) {
for (long idBcAnx : anexos) {
query = new TermQuery(new Term("id", NumericUtils.longToPrefixCoded(idBcAnx)));
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
}
}
// Busca por avalia�ao
if (avaliacao != null && !avaliacao.isEmpty() && avaliacao.length() > 0) {
query = new TermQuery(new Term("avaliacao", avaliacao));
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Busca por Gera Disponibilidade
if (gerDisp != null && !gerDisp.isEmpty() && gerDisp.length() > 0) {
query = new TermQuery(new Term("gerdisponibilidade", gerDisp));
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Busca por ID do Usu�rio Autor
if (idAutor > 0) {
query = new TermQuery(new Term("idusuarioautor", NumericUtils.longToPrefixCoded(idAutor)));
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Busca por ID do Usu�rio Aprovador
if (idAprovador > 0) {
query = new TermQuery(new Term("idusuarioaprovador", NumericUtils.longToPrefixCoded(idAprovador)));
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Busca por per�odo de data de in�cio
if (dtInicioi > 0) {
query = NumericRangeQuery.newLongRange("datainicio", dtInicioi, dtIniciof, true, true);
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Busca por per�odo de data de publica��o
if (dtPublicacaoi > 0) {
query = NumericRangeQuery.newLongRange("datapublicacao", dtPublicacaoi, dtPublicacaof, true, true);
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Busca por per�odo de data de expira��o
if (dtExpiracaoi > 0) {
query = NumericRangeQuery.newLongRange("dataexpiracao", dtExpiracaoi, dtExpiracaof, true, true);
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Busca por ID da Pasta
if (idPasta > 0) {
query = new TermQuery(new Term("idpasta", NumericUtils.longToPrefixCoded(idPasta)));
booleanQuery.add(query, BooleanClause.Occur.MUST);
}
// Ordenando por grau de similaridade e depois por n�mero de cliques decrescente
Sort sort = new Sort(new SortField[] { SortField.FIELD_SCORE,
new SortField("cliques", SortField.LONG, true) });
TopFieldCollector topField = TopFieldCollector.create(sort, 100,
true, true, true, false);
isearcher.search(booleanQuery, topField);
ScoreDoc[] hits = topField.topDocs().scoreDocs;
BaseConhecimentoDTO baseConhecimentoDTO;
Long dataCampo;
if (hits.length > 0) {
for (int i = 0; i < hits.length; i++) {
Document hitDoc = isearcher.doc(hits[i].doc);
baseConhecimentoDTO = new BaseConhecimentoDTO();
baseConhecimentoDTO.setTitulo(hitDoc.get("titulo"));
baseConhecimentoDTO.setConteudo(hitDoc.get("conteudo"));
baseConhecimentoDTO.setMedia(hitDoc.get("avaliacao"));
baseConhecimentoDTO.setGerenciamentoDisponibilidade(hitDoc.get("gerdisponibilidade"));
baseConhecimentoDTO.setIdUsuarioAutor(Integer.parseInt(hitDoc.get("idusuarioautor")));
baseConhecimentoDTO.setIdUsuarioAprovador(Integer.parseInt(hitDoc.get("idusuarioaprovador")));
dataCampo = Long.parseLong(hitDoc.get("datainicio"));
baseConhecimentoDTO.setDataInicio(new Date(dataCampo));
dataCampo = Long.parseLong(hitDoc.get("datapublicacao"));
baseConhecimentoDTO.setDataPublicacao(new Date(dataCampo));
dataCampo = Long.parseLong(hitDoc.get("dataexpiracao"));
baseConhecimentoDTO.setDataExpiracao(new Date(dataCampo));
baseConhecimentoDTO.setIdPasta(Integer.parseInt(hitDoc.get("idpasta")));
baseConhecimentoDTO.setContadorCliques(Integer.parseInt(hitDoc.get("cliques")));
baseConhecimentoDTO.setIdBaseConhecimento(Integer.parseInt(hitDoc.get("id")));
resultado.add(baseConhecimentoDTO);
}
}
indexDir.close();
dataCampo = null;
isearcher.close();
return resultado;
} catch (IOException e) {
e.printStackTrace();
return new ArrayList<BaseConhecimentoDTO>();
}
}
private ArrayList<Long> pesquisaAnexos(String indice, ArrayList<String> gemeas) throws ParseException {
try {
ArrayList<Long> resultado = new ArrayList<Long>();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(dirAnexos));
IndexSearcher isearcher = new IndexSearcher(indexDir);
QueryParser parser;
Query query;
BooleanQuery booleanQuery = new BooleanQuery();
// Pesquisa principal informada pelo usu�rio no campo nome
parser = new QueryParser(Version.LUCENE_35, "nome", analyzer);
query = parser.parse(indice);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
// Busca por refer�ncias �s palavras g�meas envolvidas no campo nome
if (gemeas != null && gemeas.size() > 0) {
for (String palavra : gemeas) {
parser = new QueryParser(Version.LUCENE_35, "nome", analyzer);
query = parser.parse(palavra);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
}
}
// Pesquisa principal informada pelo usu�rio no campo descricao
parser = new QueryParser(Version.LUCENE_35, "descricao", analyzer);
query = parser.parse(indice);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
// Busca por refer�ncias �s palavras g�meas envolvidas no campo descricao
if (gemeas != null && gemeas.size() > 0) {
for (String palavra : gemeas) {
parser = new QueryParser(Version.LUCENE_35, "descricao", analyzer);
query = parser.parse(palavra);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
}
}
// Pesquisa principal informada pelo usu�rio no campo texto
parser = new QueryParser(Version.LUCENE_35, "texto", analyzer);
query = parser.parse(indice);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
// Busca por refer�ncias �s palavras g�meas envolvidas no campo texto
if (gemeas != null && gemeas.size() > 0) {
for (String palavra : gemeas) {
parser = new QueryParser(Version.LUCENE_35, "texto", analyzer);
query = parser.parse(palavra);
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
}
}
// Ordenando por grau de similaridade e depois por n�mero de
// cliques
// decrescente
Sort sort = new Sort(new SortField[] { SortField.FIELD_SCORE,
new SortField("cliques", SortField.LONG, true) });
TopFieldCollector topField = TopFieldCollector.create(sort, 500,
true, true, true, false);
isearcher.search(booleanQuery, topField);
ScoreDoc[] hits = topField.topDocs().scoreDocs;
if (hits.length > 0) {
for (int i = 0; i < hits.length; i++) {
Document hitDoc = isearcher.doc(hits[i].doc);
resultado.add(Long.parseLong(hitDoc.get("idbaseconhecimento")));
}
}
isearcher.close();
indexDir.close();
return resultado;
} catch (IOException e) {
e.printStackTrace();
return new ArrayList<Long>();
}
}
private ArrayList<String> pesquisaPalavrasGemeas(String indice) throws ParseException {
try {
ArrayList<String> resultado = new ArrayList<String>();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
Directory indexDir = FSDirectory.open(new File(dirGemeas));
IndexSearcher isearcher = new IndexSearcher(indexDir);
QueryParser parser;
Query query;
BooleanQuery booleanQuery = new BooleanQuery();
// Localizando as palavras g�meas envolvidas a partir do que o
// usu�rio digitou
// pesquisamos palavra por palavra nos dois campos da tabela
// palavragemea
parser = new QueryParser(Version.LUCENE_35, "palavra", analyzer);
query = parser.parse(escape(indice));
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
parser = new QueryParser(Version.LUCENE_35, "correspondente", analyzer);
query = parser.parse(escape(indice));
booleanQuery.add(query, BooleanClause.Occur.SHOULD);
ScoreDoc[] hits = isearcher.search(booleanQuery, null, 1000).scoreDocs;
if (hits.length > 0) {
for (int i = 0; i < hits.length; i++) {
Document hitDoc = isearcher.doc(hits[i].doc);
resultado.add(hitDoc.get("palavra"));
resultado.add(hitDoc.get("correspondente"));
}
}
isearcher.close();
indexDir.close();
return resultado;
} catch (IOException e) {
e.printStackTrace();
return new ArrayList<String>();
}
}
private String termoPesquisaLimpo(String termo){
termo = escape(termo);
return termo;
}
public ArrayList<BaseConhecimentoDTO> pesquisaBaseConhecimento(BaseConhecimentoDTO baseConhecimentoDTO) throws ParseException, LogicException {
String indice;
String avaliacao;
String gerDisp;
long idAutor;
long idAprovador;
long dtInicioi;
long dtIniciof;
long dtPublicacaoi;
long dtPublicacaof;
long dtExpiracaoi;
long dtExpiracaof;
long idPasta;
if (baseConhecimentoDTO.getTermoPesquisa() == null || baseConhecimentoDTO.getTermoPesquisa().isEmpty()) {
indice = "";
} else {
indice = baseConhecimentoDTO.getTermoPesquisa();
indice = termoPesquisaLimpo(indice+"*");
}
if (baseConhecimentoDTO.getTermoPesquisaNota() == null || baseConhecimentoDTO.getTermoPesquisaNota().isEmpty()) {
avaliacao = "";
} else {
if (baseConhecimentoDTO.getTermoPesquisaNota().equals("S")){
avaliacao = "vazio";
} else {
avaliacao = baseConhecimentoDTO.getTermoPesquisaNota();
}
}
if (baseConhecimentoDTO.getAmDoc() == null || baseConhecimentoDTO.getAmDoc().isEmpty()) {
gerDisp = "";
} else {
gerDisp = baseConhecimentoDTO.getAmDoc();
}
if (baseConhecimentoDTO.getIdUsuarioAutorPesquisa() == null || baseConhecimentoDTO.getIdUsuarioAutorPesquisa()<=0) {
idAutor = 0;
} else {
idAutor = baseConhecimentoDTO.getIdUsuarioAutorPesquisa();
}
if (baseConhecimentoDTO.getIdUsuarioAprovadorPesquisa() == null || baseConhecimentoDTO.getIdUsuarioAprovadorPesquisa()<=0) {
idAprovador = 0;
} else {
idAprovador = baseConhecimentoDTO.getIdUsuarioAprovadorPesquisa();
}
if (baseConhecimentoDTO.getDataInicioPesquisa() == null) {
dtInicioi = 0;
} else {
dtInicioi = baseConhecimentoDTO.getDataInicioPesquisa().getTime();
}
if (baseConhecimentoDTO.getDataInicioPesquisa() == null) { //Criar o data fim Pesquisa!
dtIniciof = 0;
} else {
dtIniciof = baseConhecimentoDTO.getDataInicioPesquisa().getTime();
}
dtPublicacaoi = 0;
if (baseConhecimentoDTO.getDataInicioPublicacao() != null) {
dtPublicacaoi = baseConhecimentoDTO.getDataInicioPublicacao().getTime();
} else if (baseConhecimentoDTO.getDataPublicacaoPesquisa() != null) {
dtPublicacaoi = baseConhecimentoDTO.getDataPublicacaoPesquisa().getTime();
}
dtPublicacaof = 0;
if (baseConhecimentoDTO.getDataFimPublicacao() != null) {
dtPublicacaof = baseConhecimentoDTO.getDataFimPublicacao().getTime();
} else if (baseConhecimentoDTO.getDataPublicacaoPesquisa() != null) {
dtPublicacaof = baseConhecimentoDTO.getDataPublicacaoPesquisa().getTime();
}
if (baseConhecimentoDTO.getDataInicioExpiracao() == null) {
dtExpiracaoi = 0;
} else {
dtExpiracaoi = baseConhecimentoDTO.getDataInicioExpiracao().getTime();
}
if (baseConhecimentoDTO.getDataFimExpiracao() == null) {
dtExpiracaof = 0;
} else {
dtExpiracaof = baseConhecimentoDTO.getDataFimExpiracao().getTime();
}
if (baseConhecimentoDTO.getIdPasta() == null || baseConhecimentoDTO.getIdPasta()<=0) {
idPasta = 0;
} else {
idPasta = baseConhecimentoDTO.getIdPasta();
}
ArrayList<String> gemeas;
ArrayList<Long> listaIdsBasesConhecimentoanexas;
if (indice == null || indice.isEmpty() || indice.length() <= 1) {
gemeas = new ArrayList<String>();
listaIdsBasesConhecimentoanexas = new ArrayList<Long>();
} else {
gemeas = pesquisaPalavrasGemeas(indice);
listaIdsBasesConhecimentoanexas = pesquisaAnexos(indice, gemeas);
}
return pesquisaShould(indice, gemeas, listaIdsBasesConhecimentoanexas, avaliacao, gerDisp, idAutor, idAprovador, dtInicioi, dtIniciof, dtPublicacaoi, dtPublicacaof, dtExpiracaoi, dtExpiracaof, idPasta);
}
private static final Pattern unescape = Pattern.compile("\\\\([+\\-\"])");
private static String escape(String s) {
s = QueryParser.escape(s);
s = unescape.matcher(s).replaceAll("$1");
if ((count(s, '"') & 1) != 0) {
s += " \"";
}
return s;
}
private static int count(String s, char c) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == c) {
count++;
}
}
return count;
}
}